/**
 *    Copyright (C) 2008  Victor Smirnov <aist11@gmail.com>
 *
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 3 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License along
 *    with this program; if not, write to the Free Software Foundation, Inc.,
 *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 *    See LICENSE.exceptions in the root folder of this project for possible
 *    exceptions
 *
 */

#ifndef _CUBEFS_CORE_MAP_KV_INSERT_HPP
#define	_CUBEFS_CORE_MAP_KV_INSERT_HPP

#include <cubefs/core/btree.hpp>
#include <cubefs/core/btree/page_tools.hpp>
#include <cubefs/core/btree/pages.hpp>


namespace cubefs    {
namespace core      {
namespace map       {
namespace kv        {

class Insert22{};

}
}
}
}


namespace cubefs    {
namespace core      {
namespace btree     {

template <typename Base>
struct Strategy<cubefs::core::map::kv::Insert22, Base>: public Base {

    typedef Base                                        base;

    typedef typename base::PageMgr                      PageMgr;

    typedef typename base::Page                         Page;
    typedef typename base::Page::ID                     ID;
    typedef typename base::Transaction                        Transaction;

    typedef typename base::PageTypes                    PageTypes;

    typedef typename base::Key                          Key;
    typedef typename base::Value                        Value;
    

    typedef typename base::NodeBase                    NodeBase;
    typedef typename base::Counters                   Counters;

    typedef typename base::Iterator                   Iterator;

    typedef typename base::NodeDispatcher               NodeDispatcher;
    typedef typename base::RootDispatcher               RootDispatcher;
    typedef typename base::LeafDispatcher               LeafDispatcher;
    typedef typename base::InternalNodeDispatcher         InternalNodeDispatcher;

    typedef typename base::Node2RootMap                 Node2RootMap;
    typedef typename base::Root2NodeMap                 Root2NodeMap;

    static const long Indexes                           = base::Indexes;

const Iterator insert(Key key, const Value &value, Transaction &txn) {
    Iterator i = base::find_le(key, true, txn);
    if (i.isNotEmpty())
    {
        insert(i, key, value, txn);
    }
    else {
        insert(i, key, value, txn);
    }

    return i;
}

void insert(Iterator &iter, Key key, const Value &value, Transaction &txn) {
     base::insert(iter, key, 0, value, txn);
}

}; //Strategy

} //btree
} //core
} //cubefs

#endif	/* _CUBEFS_CORE_MAP_KV_INSERT_HPP */

